#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>

void PrintPending(sigset_t &pending)
{
    std::cout << "我是一个进程：" << getpid();
    for(int signo = 1; signo <= 32; signo++)
    {
        if(sigismember(&pending, signo))
        std::cout << "1 ";
        else
        std::cout << "0 ";
    }
    std::cout << std::endl;
}

void hander(int sig)
{
    std::cout << "2号信号已经递达" << std::endl;
}

int main()
{
    int a = 1;
    int b = a / 0;
    signal(SIGINT, hander);

    //屏蔽二号信号(为了防止恶意程序，九号信号是不可被捕捉的，被称作管理员信号)
    sigset_t block, oblock;
    sigemptyset(&block);
    sigemptyset(&oblock);

    sigaddset(&block, SIGINT);//将信号信息添加到自己的那份准备添加到当前进程pcb的block表中
    // for(int i = 1; i < 31; i++)
    // {
    //     sigaddset(&block, i);
    // }
    sigprocmask(SIG_SETMASK, &block, &oblock);//将自己的block表替换原先的block表

    int cnt = 0;
    while(1)
    { 
    //获取pending信号集合
    sigset_t pending;
    sigpending(&pending);

    if(cnt%10 == 0 && cnt != 0)
    {
        std::cout << "解除屏蔽" << std::endl;
        std::cout << "-------------------" << std::endl;
        PrintPending(pending);
        sigprocmask(SIG_SETMASK, &oblock, nullptr);
        PrintPending(pending);
    }
    //打印
    PrintPending(pending);
    sleep(1);
    cnt++;
    }
    return 0;
}